PHP FeedbackLocale Model klasse
Probleem
In een eerste opwelling zouden we enkele globale constanten kunnen creëren en een globale array om de tekstboodschappen in op te slaan. Dat levert wel direct een resultaat. Toch gaan we dit niet doen en via de lange voorbereidingsweg gaan. We maken een klasse die alle functionaliteit van het lokaliseren van tekstboodschappen netjes encapsuleert zodat we die klasse overal in onze applicatie kunnen meenemen en gebruiken.
Met de Feedbacl klasse beschikken we over een logboek waarin we tekstboodschappen kunnen opschrijven. We willen echter ook de mogelijkheid om tekstboodschappen in verschillende talen op te schrijven. Bovendien hebben we een manier nodig om onze applicatie in een taal naar keuze feedback te geven.
We kunnen de MessageFormatter
klasse van PHP combineren met onze Feedback
klasse om gemakkelijk van de ene naar de andere taal over te schakelen.
Design
We willen zo weinig mogelijk aan de klassen die we al hebben, Log en Feedback, veranderen en toch de lokalisatie functionaliteit implementeren.
Het lijkt ons een goed idee om een nieuwe feedback klasse te creëren die overerft van de Feedback
klasse en de lokalisatie functionaliteit daarin toe te voegen. We geven die nieuwe klasse de naam FeedbackLocale
en slaan die op in een bestand met de naam FeedbackLocale.php in de map modernways/dialog/src.
We koppelen die nieuwe functionaliteit aan onze mogelijkheid om naar een logboek te schrijven. We maken een nieuwe klasse die in de lokale taal in het logboek kan schrijven.
De nieuwe klasse bevat het woordenboek met de boodschappen in alle talen die door de app ondersteund moeten worden. Daarnaast voegen we een resem methodes toe om het 'klappen' in lokale talen te vergemakelijken. De volgende methode roept de code die eigenlijk de vertaling doet op:
public function connectionFailed($hostName, $databaseName) { return \MessageFormatter::formatMessage($this->locale, $this->message[$this->locale]['CONNECTION'], array($hostName, $databaseName, 'f')); }
Dan volstaat het om de methode op te roepen met twee argumenten: de hostnaam en de databasenaam:
$text = $this->log->connectionEstablished($this->hostName, $this->databaseName);
De constructor initialiseert de landstelling standaard in op en_US. Je kan die instellingen wijzigen door de gewenste locale als argument aan de constructor van de LogApp mee te geven:
Velden
naam | gegevenstype | beschrijving |
$locale | string | de landsinstelling die doorheen de app gebruikt wordt |
$message | associatieve array | bevat de tekstboodschappen voor de taalinstellingen die door de app ondersteund worden |
Methoden
We kiezen ervoor om voor elke foutmelding een methode te maken. Dat is wel omslachtig in het begin maar in het verder gebruik in de applicatie veel gemakkelijker. Ben toch nog niet helemaal zeker van die manier van werken...
naam | Bereik | retour data type | parameter | beschrijving |
__construct | public | void | $locale | stelt de landinstelling in; standaard en_US |
connectionFailed | public | string | $hostName $databaseName | Connection to host localhost to WWWET database failed. |
connectionOpened | public | string | $hostName $databaseName | Connection to host localhost to WWWET database succesfull. |
connectionClosed | public | string | $hostName $databaseName | Connection to host localhost to WWWET database disconnected. |
connectionNotConnected | public | string | $hostName $databaseName | Connection to host localhost to WWWET database not connected. |
connectionEstablished | public | string | $hostName $databaseName | Connection to host localhost to WWWET already exists. |
We voegen hier effenaan nieuwe methoden aan toe.
We gaan die nieuwe klasse nu eerst uitproberen met de Connection klasse.